home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / CALCFLD.PAK / CALCFLD.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  6KB  |  176 lines

  1. // (C) Copyright 1996, Borland International
  2. //
  3. // Calc.cpp - Calculated fields example in C++
  4. //
  5. /*********************************************************************
  6. This program demonstrates the creation and use of calculated fields that
  7. are supported by Borland's Visual Database Tools.  In order to make the
  8. example as straight forward as possible there is practically no UI coded
  9. and no data-aware controls are used.
  10.  
  11. The values of each of the calculated fields, profit.Value and
  12. profitPercent.Value in this example, are defined in the OnCalcFields function 
  13. but the actual code that defines these two fields as being calculated fields is
  14. in WinMain.  To define a field as being a calculated field the following steps
  15. must be performed before an OnCalcField event is triggered:
  16.  
  17. 1.  A new field must be created and attached to its COM object (table in this
  18.      example.
  19.  
  20. 2.  The field must be assigned a field name.
  21.  
  22. 3.  The Calculated flag for the field must be set to true.
  23.  
  24. 4.  The DataSet the field is attached to must be set.
  25.  
  26.  
  27. The files needed to build this program are:
  28.  
  29. calcfld.cpp                    Source file for application.
  30. calc32.def/calc16.def    DEF file for 32 bit target and 16 bit target
  31.                                 respectively.
  32. calcfld.ide                    BCW 5.0 project file for this example (if using
  33.                                 the BC 5.0 IDE.
  34. makefile                        Make file to build this example in a DOS box.
  35.  
  36. *****************************************************************************/
  37.  
  38. // Use ObjectWindows Library (OWL) Style Classes
  39. #include <vdbt\bdto.h>
  40.  
  41.  
  42. /****************************************************************************
  43.   EVENT HANDLER: OnCalcFields( TDataSetNotifySink&, TDataSet&)
  44.    This event handler is hooked up to the event sink in WinMain.
  45.     This event handler defines all of the calculated field values for record
  46.         referenced in DataSet.
  47. ****************************************************************************/
  48. void OnCalcFields( TDataSetNotifySink&, TDataSet& DataSet )
  49. {
  50.     TCurrencyField cost = DataSet.FieldByName(string("Cost"));
  51.     TCurrencyField salePrice = DataSet.FieldByName(string("Sale Price"));
  52.     TCurrencyField profit = DataSet.FieldByName(string("Calculated Profit"));
  53.     TFloatField profitPercent = DataSet.FieldByName(string("Calculated Profit Percent"));
  54.  
  55.    // The following 2 lines define how the calculated fields are calculated.
  56.     profit.Value = salePrice.Value - cost.Value;
  57.     profitPercent.Value = 100 * profit.Value / salePrice.Value;
  58. }
  59.  
  60. int PASCAL WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
  61. {
  62.     // Create a database table object.
  63.     PTTable table = new TTable;
  64.  
  65. /**************************************************************
  66.     SETTING UP TO USE AN EVENT HANDLER
  67.  
  68.     Visual Database Tools uses event sources and event sinks ( or handlers)
  69.     to encapsulate everything necessary for repsonding to event.  The general
  70.     steps are:
  71.     1.  Define the event source (this is done when you create a VDBT
  72.          component), in this particular example, TTable. See the line above
  73.          this comment.
  74.     2.  Define the event sink to handle the event.
  75.     3.  Connect the event sink to the event handler (OnCalcFields in this
  76.          example)
  77.     4.  Connect the event source to the event sink.
  78. **************************************************************/
  79.  
  80.     //The line below defines the event sink, OnCalcFieldsSink, and then
  81.     // connects it to the event handler OnCalcFields.
  82.  
  83.     TDataSetNotifySink OnCalcFieldsSink(TDataSetNotify_FUNCTOR( OnCalcFields ));
  84.  
  85.     // The line below connects the event source to the event sink.
  86.  
  87.     table->OnCalcFieldsSource += OnCalcFieldsSink;
  88.  
  89.     // Using a temporary TTable variable, get the TFieldDefs for the table.
  90.     TTable temptable;
  91.     temptable.DatabaseName = string( "DivePlan" );
  92.     temptable.TableName = string( "divestok.db" );
  93.     TFieldDefs fielddefs = temptable.FieldDefs;
  94.     fielddefs.Update();
  95.  
  96.     // For each item in the TFieldDefs, create a field and set its
  97.     // DataSet property.
  98.     int count = fielddefs.Count;
  99.     PTField nonCalcFields = new TField [ count ];
  100.     int i;
  101.     for (i = 0; i < count; i++)
  102.     {
  103.         nonCalcFields[i] = fielddefs[i]->CreateField( *table );
  104.         nonCalcFields[i].DataSet = table;
  105.     }
  106.  
  107.     // To add the each calculated field, create a field object and set the
  108.     // FieldName, Calculated, and DataSet properties.
  109.  
  110.     // Add the "Calculated Profit" field.
  111.     PTCurrencyField profit = new TCurrencyField( table );
  112.     profit->FieldName = string( "Calculated Profit" );
  113.     profit->Calculated = true;
  114.     profit->DataSet = table;
  115.  
  116.     // Add the "Calculated Profit Percent" field.
  117.     PTFloatField profitPercent = new TFloatField( table );
  118.     profitPercent->FieldName = string( "Calculated Profit Percent" );
  119.     profitPercent->Calculated = true;
  120.     profitPercent->DataSet = table;
  121.  
  122.     // Assign the database (a BDE alais in this example)
  123.     // and table name properties, open the table.
  124.     table->DatabaseName = string( "DivePlan" );
  125.     table->TableName = string( "divestok.db" );
  126.     table->Open();
  127.  
  128.     // Put the table in SetKey state (search mode)
  129.     table->SetKey();
  130.  
  131.     // Go to the record for Item No 90057 (Power Inflator).
  132.     table->FieldByName( string("Item No") )->AsString = string("90057");
  133.  
  134.     // If Item 90057 was found...
  135.     if (table->GotoKey())
  136.     {
  137.         //If the description matches our expectation...
  138.         if (table->FieldByName( string("Description") )->AsString == 
  139.                                                                       string("Power Inflator") )
  140.         {
  141.             int count = table->FieldCount;
  142.             int i;
  143.             // Print out each of the non calculated and calculated fields in
  144.             //    their own separate message box.
  145.             for (i = 0; i < count; i++)
  146.             {
  147.                 MessageBox( 0, table->Fields[i]->AsString->c_str(),
  148.                             table->Fields[i]->FieldName->c_str(), MB_OK );
  149.             }
  150.         }
  151.         else
  152.         {
  153.             MessageBox( 0, "Unexpected Description field value.", "Error", MB_OK );
  154.         }
  155.     }
  156.     else
  157.     {
  158.         MessageBox( 0, "Could not find Item No 90057.", "Error", MB_OK );
  159.     }
  160.  
  161.     // Clean up
  162.     if (profit)
  163.         delete profit;
  164.     if (profitPercent)
  165.         delete profitPercent;
  166.     if (nonCalcFields)
  167.         delete [] nonCalcFields;
  168.     if (table)
  169.         delete table;
  170.  
  171.     return 0;
  172. }
  173.  
  174. /******************************************************************************/
  175.  
  176.